#!/bin/bash
#生成日志文件
#log函数有两个参数，第一个参数为文件路径，第二个参数为文件s位类型，
#U代表SUID，G代表SGID，UG代表SUID+SGID
function log()
{
#通过 >> 将日志信息写入到日志文件
	if [[ $2 = "G" ]];then
		echo "$1 is SGID"+`date` >> SGID.log; 
	elif [[ $2 = "UG" ]];then
		echo "$1 is SUID+SGID"+`date` >> SUID_SGID.log; 
	else
		echo "$1 is SUID "+`date` >> SUID.log; 
	fi 
}
#判断用户输入，并根据输入去掉S位
#change函数有两个参数，第一个参数为文件路径，第二个参数为文件s位类型，
#U代表SUID，G代表SGID，UG代表SUID+SGID
function change()  
{
	read re             
	if [[ $re = "y" ]] ;then
		#判断用户输入
		chmod a-s $1
		echo "修改成功"
		#调用日志函数
		log $1 $2
	else
		echo "取消修改"
	fi
}
#遍历函数 参数为 需要遍历的路径
function coun()
{
	if [ ! -d $1 ];then
		echo " 此目录不存在！是否继续? y/N"
		read y
		if [[ $y = "y" ]];then
			echo " 请输入要遍历的目录： "
			read path
			coun $1
		else
			exit;
		fi
		
	fi
	#通过find函数先找到具有s为的文件，然后用正则表达式来判断s位位置
	for file in `find $1 -perm +a=s 2>/dev/null`
	do
		if [[ `ls -l $file | grep -P '[a-z-]{1}[rwx-]{3}[rw-]{2}[sS]{1}[rwx-]{3}' 2>/dev/null` ]];then
			#通过正则表达式判断文件为SGID
			echo $file ":文件是SGID，是否修改？y/N";
			change $file "G"
		elif [[ `ls -l $file | grep -P '[a-z-]{1}[rw-]{2}[sS]{1}[rw-]{2}[sS]{1}[rwx-]{3}' 2>/dev/null` ]] ;then
			#通过正则表达式判断文件为双S位
			echo $file ":文件是SUID + SGID，是否修改？y/N";
			change $file "UG"
		else
			#文件为SUID
			echo $file ":文件是SUID，是否修改？y/N";
			change $file "U"			
		fi
		#询问是否继续遍历
		echo '是否继续?(退出请按q)';
		read esc
		if [[ $esc = "q" ]];then
			#准备退出程序，询问是否显示日志文件
			echo "是否查看日志文件?y/N";
			read view			
			if [[ $view = "y" ]];then
				#显示日志文件
				cat SUID.log
				cat SGID.log
				cat SUID_SGID.log		
			fi	
			exit;
		fi
	done
}
#询问是否遍历所有目录
echo "遍历所有目录?y/N"
read all
path="/"
#初始化目录
#判断是否需要遍历所有目录，即遍历根目录
if [[ $all = "y" ]];then
	coun $path
else
#不需要遍历所有目录
	echo " 请输入要遍历的目录： "
	read path
	coun $path
fi

